package com.vspuzzle;

import java.util.Map;

import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.RelativeLayout;
import android.widget.TextView;

class GestureListener implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener {

 final Gioco activity;
 final TextView view;
 final class_Game15 game15;
 final Map<Integer, Map<String,Integer> > matrice_text_views;
 
 // Variabili Ausiliarie;
 int rel_zero_x = 0;
 int rel_zero_y = 0;
 
 float rel_arrivo_x = 0;
 float rel_arrivo_y = 0;
 long time_scroll = 0;
 float dist_scroll = 0;
	
 
 /* A volte il Fling quando il scroll e' lento, non viene eseguito. Quindi si ha la necessita'
  * del seguente metodo ausiliario per uno "scrolling lento" */
 public boolean my_actionUp(MotionEvent e){
	 if(rel_zero_x==0 && rel_zero_y==0)
			return true;
	 
	 int num1,num2,num3,arr1,arr2,arr3,arrz;
	 num1=num2=num3=arr1=arr2=arr3=arrz=-1;
	 
	 final Map<String, Integer> data_numero = matrice_text_views.get(this.view.getId());
	 
	 num1 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")];
	 
	 if(Math.abs(rel_zero_x) >1){
		 int neg = (rel_zero_x<0) ? -1 : 1;
		 num2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+(neg)];
		 if(Math.abs(rel_zero_x) >2){
			 num3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+(neg*2)];
		 }
	 }
	 if(Math.abs(rel_zero_y) >1){
		 int neg = (rel_zero_y<0) ? -1 : 1;
		 num2 = game15.matrice_gioco[data_numero.get("y")+neg][data_numero.get("x")];
		 if(Math.abs(rel_zero_y) >2){
			 num3 = game15.matrice_gioco[data_numero.get("y")+(neg*2)][data_numero.get("x")];
		 }
	 }
	 
	 if(rel_zero_y==0){
		 if(rel_zero_x<0){
			 if(rel_arrivo_x>0){
				 arr1 = num1; 
				 if(num2!=-1) arr2 = num2;
				 if(num3!=-1) arr3 = num3;
			 }else{
				 arr1 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-1];
				 arrz = num1; 
				 if(num2!=-1) arr2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-2];
				 if(num3!=-1) arr3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-3];
			 }
		 }else{
			 if(rel_arrivo_x>0){
				 arr1 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+1];
				 arrz = num1;
				 if(num2!=-1) arr2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+2];
				 if(num3!=-1) arr3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+3];
			 }else{
				 arr1 = num1; 
				 if(num2!=-1) arr2 = num2;
				 if(num3!=-1) arr3 = num3;
			 }
		 }
	 }else{
		 if(rel_zero_y<0){
			 if(rel_arrivo_y>0){
				 arr1 = num1; 
				 if(num2!=-1) arr2 = num2;
				 if(num3!=-1) arr3 = num3;
			 }else{
				 arr1 = game15.matrice_gioco[data_numero.get("y")-1][data_numero.get("x")];
				 arrz = num1; 
				 if(num2!=-1) arr2 = game15.matrice_gioco[data_numero.get("y")-2][data_numero.get("x")];
				 if(num3!=-1) arr3 = game15.matrice_gioco[data_numero.get("y")-3][data_numero.get("x")];
			 }
		 }else{
			 if(rel_arrivo_y>0){
				 arr1 = game15.matrice_gioco[data_numero.get("y")+1][data_numero.get("x")];
				 arrz = num1;
				 if(num2!=-1) arr2 = game15.matrice_gioco[data_numero.get("y")+2][data_numero.get("x")];
				 if(num3!=-1) arr3 = game15.matrice_gioco[data_numero.get("y")+3][data_numero.get("x")];
			 }else{
				 arr1 = num1; 
				 if(num2!=-1) arr2 = num2;
				 if(num3!=-1) arr3 = num3;
			 }
		 }
	 }
	 
	 
	 
	 float px_ms = (dist_scroll / time_scroll);
	 px_ms = 1- Math.abs(px_ms);
	 long time = (long)(200* px_ms);
	 Handler handler = new MyHandler();
 	 new AnitmationTessera(handler,activity, game15, matrice_text_views, num1, num2,num3, arr1,arr2,arr3,arrz, time);
	 
	 rel_zero_x =0;
	 rel_zero_y =0;
	return true;
}
 
public GestureListener(Gioco activity, final TextView view, class_Game15 game15, Map<Integer, Map<String,Integer> > matrice_text_views) {
	this.view = view;
	this.game15 = game15;
	this.matrice_text_views = matrice_text_views;
	this.activity = activity;
}

@Override
public boolean onDoubleTap(MotionEvent e) {
	return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
	return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
	return false;
}
@Override
public boolean onDown(MotionEvent e) {
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
		float velocityY) {
	/*
	if(rel_zero_x==0 && rel_zero_y==0)// No Fling se non si ha libero movimento
		return true;
	
	TextView tessera1 = null;
	TextView tessera2 = null;
	TextView tessera3 = null;
	
	final Map<String, Integer> data_numero = matrice_text_views.get(this.view.getId());
	
	if(rel_zero_y==0){
		
		if(rel_zero_x<0){
			int num = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-1];
			tessera1 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(num));
			
			if(rel_zero_x<-1){
				int pos2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-2];
			    tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
			    if(rel_zero_x==-3){
					int pos3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-3];
				    tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
				}
			}
		}else{
			int num = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+1];
			tessera1 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(num));
			
			if(rel_zero_x>1){
				int pos2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+2];
			    tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
			    if(rel_zero_x==3){
					int pos3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+3];
				    tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
				}
			}		
		}
	}
	if(rel_zero_x==0){
		if(rel_zero_x<0){
			int num = game15.matrice_gioco[data_numero.get("y")-1][data_numero.get("x")];
			tessera1 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(num));
			
			if(rel_zero_x<-1){
				int pos2 = game15.matrice_gioco[data_numero.get("y")-2][data_numero.get("x")];
			    tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
			    if(rel_zero_x==-3){
					int pos3 = game15.matrice_gioco[data_numero.get("y")-3][data_numero.get("x")];
				    tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
				}
			}
		}else{
			int num = game15.matrice_gioco[data_numero.get("y")+1][data_numero.get("x")];
			tessera1 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(num));
			
			if(rel_zero_x>1){
				int pos2 = game15.matrice_gioco[data_numero.get("y")+2][data_numero.get("x")];
			    tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
			    if(rel_zero_x==3){
					int pos3 = game15.matrice_gioco[data_numero.get("y")+3][data_numero.get("x")];
				    tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
				}
			}		
		}
	}
	
	
	float velocita = Math.max(Math.abs(velocityX),Math.abs(velocityY));
    
	Handler handler = new MyHandler();
	double secondi = 1.2 / Math.log10(velocita);
	long time = (long) (secondi*1000);
	new AnitmationTessera(handler,activity, game15, matrice_text_views, this.view, tessera1, tessera2, tessera3, time);
	
	
	rel_zero_x = 0;
    rel_zero_y=0;
    
	rel_arrivo_x = e2.getX() - e1.getX();
	rel_arrivo_y = e2.getY() - e1.getY();
	dist_scroll = Math.max(Math.abs(rel_arrivo_x), Math.abs(rel_arrivo_y));
	time_scroll = e2.getEventTime() - e1.getEventTime();
	dist_scroll = Math.max(Math.abs(rel_arrivo_x), Math.abs(rel_arrivo_y));
	
	my_actionUp(e2);
    return true;
*/return false;
}

@Override
public void onLongPress(MotionEvent e) {
}

private void muovi_le_cose(int new_leftMargin, int new_topMargin){
	
	//Map<String, Integer> data_zero = matrice_text_views.get(R.id.tessera_0);
	Map<String, Integer> data_numero = matrice_text_views.get(this.view.getId());
	
	LayoutParams p =  this.view.getLayoutParams();
	MarginLayoutParams m =  (MarginLayoutParams) p;
	
	//Controllo l'asse di movimento
	if(new_topMargin==-1){// Asse X
		//Limito i movimenti
		int maxLeft; 
		int maxRight;
		if(rel_zero_x<0){
			int num = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-1];
			Map<String, Integer> data_num = matrice_text_views.get(Gioco.get_id_view_tessera(num));
			maxLeft = data_num.get("leftMargin") ;
			
			maxRight = data_numero.get("leftMargin") ;
		}else{
			maxLeft = data_numero.get("leftMargin") ;
			
			int num = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+1];
			Map<String, Integer> data_num = matrice_text_views.get(Gioco.get_id_view_tessera(num));
			maxRight = data_num.get("leftMargin") ;
		}		
		new_leftMargin = (new_leftMargin>maxRight)? maxRight : new_leftMargin;
		new_leftMargin = (new_leftMargin<maxLeft) ? maxLeft  : new_leftMargin;
		
		if(rel_zero_x>1){
			int pos2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+1];
			TextView tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
			LayoutParams p2 =  tessera2.getLayoutParams();
			MarginLayoutParams m2 =  (MarginLayoutParams) p2;
			m2.leftMargin = new_leftMargin + m2.width;
			tessera2.setLayoutParams(m2);
			if(rel_zero_x==3){
				int pos3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")+2];
				TextView tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
				LayoutParams p3 =  tessera3.getLayoutParams();
				MarginLayoutParams m3 =  (MarginLayoutParams) p3;
				m3.leftMargin = m2.leftMargin + m3.width;
				tessera3.setLayoutParams(m3);
			}
		}else{
			if(rel_zero_x<-1){
				int pos2 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-1];
				TextView tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
				LayoutParams p2 =  tessera2.getLayoutParams();
				MarginLayoutParams m2 =  (MarginLayoutParams) p2;
				m2.leftMargin = new_leftMargin - m2.width;
				tessera2.setLayoutParams(m2);
				if(rel_zero_x==-3){
					int pos3 = game15.matrice_gioco[data_numero.get("y")][data_numero.get("x")-2];
					TextView tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
					LayoutParams p3 =  tessera3.getLayoutParams();
					MarginLayoutParams m3 =  (MarginLayoutParams) p3;
					m3.leftMargin = m2.leftMargin - m3.width;
					tessera3.setLayoutParams(m3);
				}
			}
		}
		if(new_leftMargin==m.leftMargin)
			rel_arrivo_x = rel_zero_x;
		else{
			if(new_leftMargin>m.leftMargin){
				rel_arrivo_x=1;
			}else{
				rel_arrivo_x=-1;
			}
		}
		m.leftMargin = new_leftMargin;
	}
	
	if(new_leftMargin==-1){// Asse Y

		int maxTop; 
		int maxBottom;
		if(rel_zero_y<0){
			int num = game15.matrice_gioco[data_numero.get("y")-1][data_numero.get("x")];
			Map<String, Integer> data_num = matrice_text_views.get(Gioco.get_id_view_tessera(num));
			maxTop = data_num.get("topMargin") ;
			
			maxBottom = data_numero.get("topMargin") ;
		}else{
			maxTop = data_numero.get("topMargin") ;
			
			int num = game15.matrice_gioco[data_numero.get("y")+1][data_numero.get("x")];
			Map<String, Integer> data_num = matrice_text_views.get(Gioco.get_id_view_tessera(num));
			maxBottom = data_num.get("topMargin") ;
		}		
		new_topMargin = (new_topMargin>maxBottom)? maxBottom : new_topMargin;
		new_topMargin = (new_topMargin<maxTop) ? maxTop  : new_topMargin;
		
		if(rel_zero_y>1){
			int pos2 = game15.matrice_gioco[data_numero.get("y")+1][data_numero.get("x")];
			TextView tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
			LayoutParams p2 =  tessera2.getLayoutParams();
			MarginLayoutParams m2 =  (MarginLayoutParams) p2;
			m2.topMargin = new_topMargin + m2.height;
			tessera2.setLayoutParams(m2);
			if(rel_zero_y==3){
				int pos3 = game15.matrice_gioco[data_numero.get("y")+2][data_numero.get("x")];
				TextView tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
				LayoutParams p3 =  tessera3.getLayoutParams();
				MarginLayoutParams m3 =  (MarginLayoutParams) p3;
				m3.topMargin = m2.topMargin + m3.height;
				tessera3.setLayoutParams(m3);
			}
		}else{
			if(rel_zero_y<-1){
				int pos2 = game15.matrice_gioco[data_numero.get("y")-1][data_numero.get("x")];
				TextView tessera2 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos2));
				LayoutParams p2 =  tessera2.getLayoutParams();
				MarginLayoutParams m2 =  (MarginLayoutParams) p2;
				m2.topMargin = new_topMargin - m2.height;
				tessera2.setLayoutParams(m2);
				if(rel_zero_y==-3){
					int pos3 = game15.matrice_gioco[data_numero.get("y")-2][data_numero.get("x")];
					TextView tessera3 = (TextView) activity.findViewById(Gioco.get_id_view_tessera(pos3));
					LayoutParams p3 =  tessera3.getLayoutParams();
					MarginLayoutParams m3 =  (MarginLayoutParams) p3;
					m3.topMargin = m2.topMargin - m3.height;
					tessera3.setLayoutParams(m3);
				}
			}
		}
		if(new_topMargin==m.topMargin)
			rel_arrivo_y=rel_zero_y;
		else{
			if(new_topMargin>m.topMargin){
				rel_arrivo_y=1;
			}else{
				rel_arrivo_y=-1;
			}
		}
		m.topMargin = new_topMargin;
	}
	
	
	
	this.view.setLayoutParams(m);
}

@SuppressLint("HandlerLeak")
private class MyHandler extends Handler {
	@Override
    public void handleMessage(Message msg) {
      Bundle bundle = msg.getData();
      if(bundle.containsKey("move_text_view")) {
	    int [] value = bundle.getIntArray("move_text_view");
	    TextView tv = (TextView) activity.findViewById(value[0]);
	    MarginLayoutParams margins = (MarginLayoutParams) tv.getLayoutParams();
	    margins.leftMargin = value[1];
	    margins.topMargin = value[2];
	    tv.setLayoutParams(margins);
      }
    }
  }


@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
		float distanceY) {	
	LayoutParams p =  this.view.getLayoutParams();
	MarginLayoutParams m =  (MarginLayoutParams) p;
	
	time_scroll = e2.getEventTime() - e1.getEventTime();
	rel_arrivo_x = e2.getX() - e1.getX();
	rel_arrivo_y = e2.getY() - e1.getY();
	dist_scroll = Math.max(Math.abs(rel_arrivo_x), Math.abs(rel_arrivo_y));
	
	int x = (int) e2.getX();
	int y = (int) e2.getY();

	int centro_tessera_x =  (m.width /2);
	int centro_tessera_y = (m.height /2);
	
	Map<String, Integer> text_view_data = matrice_text_views.get(this.view.getId());
	
	//Trovo l'asse di movimento
	if(Math.abs(rel_arrivo_x) > Math.abs(rel_arrivo_y)){
		if(rel_zero_y==0){//Posso considerare l'asse X solo se non si sta operando sull'asse Y
			if(rel_arrivo_x<0 ){
				if(game15.movimento_1_tessera_consentito(text_view_data.get("x"),text_view_data.get("y"),'O')){
					rel_zero_x = -1;
				}else{
					if(game15.movimento_2_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'O')){
						rel_zero_x = -2;
					}else{
						if(game15.movimento_3_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'O')){
							rel_zero_x = -3;
						}
					}
				}
				if(rel_zero_x!=0)
					muovi_le_cose( m.leftMargin - (centro_tessera_x - x),-1);
			}else{
				if(game15.movimento_1_tessera_consentito(text_view_data.get("x"),text_view_data.get("y"),'E')){
					rel_zero_x = 1;
				}else{
					if(game15.movimento_2_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'E')){
						rel_zero_x = 2;
					}else{
						if(game15.movimento_3_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'E')){
							rel_zero_x = 3;
						}
					}
				}
				if(rel_zero_x!=0)
					muovi_le_cose( m.leftMargin + (x - centro_tessera_x),-1);
			}
		}
	}else{
		if(rel_zero_x==0){
			if(rel_arrivo_y<0 ){
				if(game15.movimento_1_tessera_consentito(text_view_data.get("x"),text_view_data.get("y"),'N')){
					rel_zero_y = -1;
				}else{
					if(game15.movimento_2_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'N')){
						rel_zero_y = -2;
					}else{
						if(game15.movimento_3_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'N')){
							rel_zero_y = -3;
						}
					}
				}
				if(rel_zero_y!=0)
					muovi_le_cose(-1, m.topMargin - (centro_tessera_y - y));
				
			}else{
				if(game15.movimento_1_tessera_consentito(text_view_data.get("x"),text_view_data.get("y"),'S')){
					rel_zero_y = 1;
				}else{
					if(game15.movimento_2_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'S')){
						rel_zero_y = 2;
					}else{
						if(game15.movimento_3_tessere_consentito(text_view_data.get("x"),text_view_data.get("y"),'S')){
							rel_zero_y = 3;
						}
					}
				}
				if(rel_zero_y!=0)
					muovi_le_cose(-1, m.topMargin + (y - centro_tessera_y));
				
			}
		}	
	}
	
    return true;
}

@Override
public void onShowPress(MotionEvent e) {
}

@Override
public boolean onSingleTapUp(MotionEvent e) {
	return false;
}


}





/* Se x e y fossero assolute, il codice sarebbe stato questo
LayoutParams p =  this.view.getLayoutParams();
MarginLayoutParams m =  (MarginLayoutParams) p;

int x =-1* (int) e2.getX(e2.getPointerCount()) ;
int y =-1* (int) e2.getY(e2.getPointerCount()) ; 


RelativeLayout layout_tessere = (RelativeLayout) view.getParent();
RelativeLayout padre = (RelativeLayout) layout_tessere.getParent();

int relative_x = padre.getPaddingLeft();
int relative_y = ((MarginLayoutParams) layout_tessere.getLayoutParams()).bottomMargin + ((MarginLayoutParams) layout_tessere.getLayoutParams()).height;
relative_y = display_size.y - relative_y;

m.leftMargin = x - relative_x ;
m.topMargin = y - relative_y;
		
this.view.setLayoutParams(m);*/
